// 递归过滤函数

import type { SysDeptListType } from '@/views/admin/system/dept/utils/model'

export function filterTree(data: SysDeptListType[], query: string): SysDeptListType[] {
  return data.reduce((acc: SysDeptListType[], dept) => {
    let shouldIncludeDept = dept.deptName.toLowerCase().includes(query.toLowerCase())
    let filteredChildren: SysDeptListType[] = []
    if (dept.children && dept.children.length > 0) {
      // 递归过滤子节点
      filteredChildren = filterTree(dept.children, query)
      shouldIncludeDept = shouldIncludeDept || filteredChildren.length > 0
    }
    if (shouldIncludeDept) {
      // 如果当前节点符合条件或者它的子节点中有符合条件的节点，则添加当前节点
      acc.push({
        ...dept,
        children: filteredChildren.length > 0 ? filteredChildren : undefined
      })
    }
    return acc
  }, [])
}

/**
 * 在树结构中递归查找指定 ID 的部门
 * @param id - 要查找的部门 ID
 * @param root - 当前的根节点
 * @returns 找到的部门节点
 */
function findDepartmentById(
  id: number,
  root: SysDeptListType | undefined
): SysDeptListType | undefined {
  if (!root) return undefined

  if (root.id === id) {
    return root
  }

  for (const child of root.children || []) {
    const found = findDepartmentById(id, child)
    if (found) return found
  }

  return undefined
}

/**
 * 在整个树结构中查找指定 ID 的部门
 * @param id - 要查找的部门 ID
 * @param treeData - 整个树结构数据
 * @returns 找到的部门节点
 */
function findDepartmentInTree(
  id: number,
  treeData: SysDeptListType[]
): SysDeptListType | undefined {
  for (const root of treeData) {
    const found = findDepartmentById(id, root)
    if (found) return found
  }
  return undefined
}

/**
 * 获取指定树 ID 的所有父级 ID
 * @param id - 要查找的 ID
 * @param treeData
 * @returns 父级 ID 列表
 */
export function getAllParentIds(id: number, treeData: any[]): number[] {
  const path: number[] = []

  // 在整个树结构中查找目标部门
  const selectedNode = findDepartmentInTree(id, treeData)

  if (selectedNode) {
    function findParents(node: SysDeptListType | undefined) {
      if (!node || node.pid === 0) return
      path.unshift(node.pid) // 将父级 ID 添加到路径的开头
      // 在整个树结构中查找父节点
      const parent = findDepartmentInTree(node.pid, treeData)
      if (parent) {
        findParents(parent) // 继续向上查找
      }
    }

    findParents(selectedNode)
  }

  return path.length > 0 ? [...path, id] : [id] // 返回路径，包括初始的 id
}
